home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 748 / 748.xpi / content / prefmanager.js < prev    next >
Text File  |  2010-02-11  |  4KB  |  151 lines

  1. var GM_prefRoot = new GM_PrefManager();
  2.  
  3. GM_PrefManager.MIN_INT_32 = -0x80000000;
  4. GM_PrefManager.MAX_INT_32 = 0x7FFFFFFF;
  5.  
  6. /**
  7.  * Simple API on top of preferences for greasemonkey.
  8.  * Construct an instance by passing the startPoint of a preferences subtree.
  9.  * "greasemonkey." prefix is assumed.
  10.  */
  11. function GM_PrefManager(startPoint) {
  12.   if (!startPoint) {
  13.     startPoint = "";
  14.   }
  15.  
  16.   startPoint = "greasemonkey." + startPoint;
  17.  
  18.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  19.                        .getService(Components.interfaces.nsIPrefService)
  20.                        .getBranch(startPoint);
  21.  
  22.   var observers = {};
  23.   const nsISupportsString = Components.interfaces.nsISupportsString;
  24.  
  25.   /**
  26.    * whether a preference exists
  27.    */
  28.   this.exists = function(prefName) {
  29.     return pref.getPrefType(prefName) != 0;
  30.   };
  31.  
  32.   /**
  33.    * enumerate preferences
  34.    */
  35.   this.listValues = function() {
  36.     return pref.getChildList("", {});
  37.   }
  38.  
  39.   /**
  40.    * returns the named preference, or defaultValue if it does not exist
  41.    */
  42.   this.getValue = function(prefName, defaultValue) {
  43.     var prefType = pref.getPrefType(prefName);
  44.  
  45.     // underlying preferences object throws an exception if pref doesn't exist
  46.     if (prefType == pref.PREF_INVALID) {
  47.       return defaultValue;
  48.     }
  49.  
  50.     try {
  51.       switch (prefType) {
  52.         case pref.PREF_STRING:
  53.           return pref.getComplexValue(prefName, nsISupportsString).data;
  54.         case pref.PREF_BOOL:
  55.           return pref.getBoolPref(prefName);
  56.         case pref.PREF_INT:
  57.           return pref.getIntPref(prefName);
  58.       }
  59.     } catch(ex) {
  60.       return defaultValue != undefined ? defaultValue : null;
  61.     }
  62.     return null;
  63.   };
  64.  
  65.   /**
  66.    * sets the named preference to the specified value. values must be strings,
  67.    * booleans, or integers.
  68.    */
  69.   this.setValue = function(prefName, value) {
  70.     var prefType = typeof(value);
  71.     var goodType = false;
  72.  
  73.     switch (prefType) {
  74.       case "string":
  75.       case "boolean":
  76.         goodType = true;
  77.         break;
  78.       case "number":
  79.         if (value % 1 == 0 &&
  80.             value >= GM_PrefManager.MIN_INT_32 &&
  81.             value <= GM_PrefManager.MAX_INT_32) {
  82.           goodType = true;
  83.         }
  84.         break;
  85.     }
  86.  
  87.     if (!goodType) {
  88.       throw new Error("Unsupported type for GM_setValue. Supported types " +
  89.                       "are: string, bool, and 32 bit integers.");
  90.     }
  91.  
  92.     // underlying preferences object throws an exception if new pref has a
  93.     // different type than old one. i think we should not do this, so delete
  94.     // old pref first if this is the case.
  95.     if (this.exists(prefName) && prefType != typeof(this.getValue(prefName))) {
  96.       this.remove(prefName);
  97.     }
  98.  
  99.     // set new value using correct method
  100.     switch (prefType) {
  101.       case "string":
  102.         var str = Components.classes["@mozilla.org/supports-string;1"]
  103.                             .createInstance(nsISupportsString);
  104.         str.data = value;
  105.         pref.setComplexValue(prefName, nsISupportsString, str);
  106.         break;
  107.       case "boolean":
  108.         pref.setBoolPref(prefName, value);
  109.         break;
  110.       case "number":
  111.         pref.setIntPref(prefName, Math.floor(value));
  112.         break;
  113.     }
  114.   };
  115.  
  116.   /**
  117.    * deletes the named preference or subtree
  118.    */
  119.   this.remove = function(prefName) {
  120.     pref.deleteBranch(prefName);
  121.   };
  122.  
  123.   /**
  124.    * call a function whenever the named preference subtree changes
  125.    */
  126.   this.watch = function(prefName, watcher) {
  127.     // construct an observer
  128.     var observer = {
  129.       observe:function(subject, topic, prefName) {
  130.         watcher(prefName);
  131.       }
  132.     };
  133.  
  134.     // store the observer in case we need to remove it later
  135.     observers[watcher] = observer;
  136.  
  137.     pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal).
  138.       addObserver(prefName, observer, false);
  139.   };
  140.  
  141.   /**
  142.    * stop watching
  143.    */
  144.   this.unwatch = function(prefName, watcher) {
  145.     if (observers[watcher]) {
  146.       pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal).
  147.         removeObserver(prefName, observers[watcher]);
  148.     }
  149.   };
  150. }
  151.